package com.ld.poetry.controller;

import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.ld.poetry.aop.LoginCheck;
import com.ld.poetry.aop.SaveCheck;
import com.ld.poetry.config.PoetryResult;
import com.ld.poetry.constants.CommonConst;
import com.ld.poetry.dao.ResourcePathMapper;
import com.ld.poetry.entity.ResourcePath;
import com.ld.poetry.utils.PoetryUtil;
import com.ld.poetry.vo.ResourcePathVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 * 资源聚合里的友链，其他接口在ResourceAggregationController
 * </p>
 *
 * @author sara
 * @since 2021-09-14
 */
@RestController
@RequestMapping("/webInfo")
public class FriendController {

    @Autowired
    private ResourcePathMapper resourcePathMapper;

    /**
     * 保存友链
     * 
     * 功能说明：
     * 1. 保存新的友链信息到数据库
     * 2. 需要用户登录权限
     * 3. 需要进行保存检查
     * 
     * 请求参数：
     * @param resourcePathVO 友链信息对象，包含以下字段：
     *   - title: 友链标题（必填）
     *   - cover: 友链封面图片（必填）
     *   - url: 友链地址（必填）
     *   - introduction: 友链介绍（必填）
     * 
     * 返回结果：
     * @return PoetryResult 操作结果
     *   - 成功：返回成功信息
     *   - 失败：返回错误信息（如：信息不全）
     * 
     * 处理流程：
     * 1. 验证必填字段是否完整
     * 2. 创建新的友链对象
     * 3. 设置友链属性：
     *    - classify: 设置为默认友链分类
     *    - type: 设置为友链类型
     *    - status: 初始状态为未审核
     *    - remark: 记录创建用户ID
     * 4. 保存到数据库
     * 
     * 注意事项：
     * 1. 需要用户登录才能操作
     * 2. 所有必填字段不能为空
     * 3. 新添加的友链默认状态为未审核
     * 4. 友链信息需要管理员审核后才能显示
     */
    @LoginCheck  // 登录检查注解，确保用户已登录
    @PostMapping("/saveFriend")  // 定义POST请求路径
    @SaveCheck  // 保存检查注解，进行额外的保存验证
    public PoetryResult saveFriend(@RequestBody ResourcePathVO resourcePathVO) {
        // 验证必填字段是否完整
        if (!StringUtils.hasText(resourcePathVO.getTitle()) || !StringUtils.hasText(resourcePathVO.getCover()) ||
                !StringUtils.hasText(resourcePathVO.getUrl()) || !StringUtils.hasText(resourcePathVO.getIntroduction())) {
            return PoetryResult.fail("信息不全！");  // 返回错误信息
        }

        // 创建新的友链对象
        ResourcePath friend = new ResourcePath();
        
        // 设置友链属性
        friend.setClassify(CommonConst.DEFAULT_FRIEND);  // 设置默认友链分类
        friend.setTitle(resourcePathVO.getTitle());  // 设置友链标题
        friend.setIntroduction(resourcePathVO.getIntroduction());  // 设置友链介绍
        friend.setCover(resourcePathVO.getCover());  // 设置友链封面
        friend.setUrl(resourcePathVO.getUrl());  // 设置友链地址
        friend.setRemark(PoetryUtil.getUserId().toString());  // 记录创建用户ID
        friend.setType(CommonConst.RESOURCE_PATH_TYPE_FRIEND);  // 设置类型为友链
        friend.setStatus(Boolean.FALSE);  // 设置初始状态为未审核

        // 保存到数据库
        resourcePathMapper.insert(friend);
        
        // 返回成功结果
        return PoetryResult.success();
    }

    /**
     * 查询友链
     * 
     * 功能说明：
     * 1. 获取所有已审核通过的友链信息
     * 2. 按分类对友链进行分组
     * 3. 按创建时间升序排序
     * 
     * 返回数据：
     * @return PoetryResult<Map<String, List<ResourcePathVO>>> 
     *   - key: 友链分类名称
     *   - value: 该分类下的友链列表
     * 
     * 数据结构：
     * {
     *   "分类名称1": [
     *     {
     *       "id": "友链ID",
     *       "title": "友链标题",
     *       "cover": "封面图片",
     *       "url": "友链地址",
     *       "introduction": "友链介绍",
     *       "classify": "分类名称",
     *       "type": 1,
     *       "status": true,
     *       "createTime": "创建时间",
     *       "updateTime": "更新时间"
     *     }
     *   ]
     * }
     * 
     * 注意事项：
     * 1. 只返回已审核通过的友链（status = true）
     * 2. 友链按创建时间升序排序
     * 3. 返回的友链按分类分组，方便前端展示
     */
    @GetMapping("/listFriend")
    public PoetryResult<Map<String, List<ResourcePathVO>>> listFriend() {
        // 创建查询条件构建器
        LambdaQueryChainWrapper<ResourcePath> wrapper = new LambdaQueryChainWrapper<>(resourcePathMapper);
        
        // 设置查询条件：类型为友链且状态为已审核
        List<ResourcePath> resourcePaths = wrapper.eq(ResourcePath::getType, CommonConst.RESOURCE_PATH_TYPE_FRIEND)
                .eq(ResourcePath::getStatus, Boolean.TRUE)
                .orderByAsc(ResourcePath::getCreateTime)  // 按创建时间升序排序
                .list();
        
        // 初始化返回结果Map
        Map<String, List<ResourcePathVO>> collect = new HashMap<>();
        
        // 如果查询结果不为空，则进行数据转换和分组
        if (!CollectionUtils.isEmpty(resourcePaths)) {
            collect = resourcePaths.stream()
                    .map(rp -> {
                        // 将ResourcePath对象转换为ResourcePathVO对象
                        ResourcePathVO resourcePathVO = new ResourcePathVO();
                        BeanUtils.copyProperties(rp, resourcePathVO);
                        return resourcePathVO;
                    })
                    // 按分类名称进行分组
                    .collect(Collectors.groupingBy(ResourcePathVO::getClassify));
        }
        
        // 返回成功结果
        return PoetryResult.success(collect);
    }
}
